Die Arbeitsmappe LZwischenresultate.xls illustriert das Arbeiten mit Auflistungen. Das Bild unten zeigt die Benutzerschnittstelle. Die Aufgabe lautet:
a) Schreiben Sie ein Programm, ...
das ein neues Tabellenblatt "Zwischenresultate" in die aktuelle Arbeitsmappe einfügt, falls dieses Tabellenblatt noch nicht existiert bzw.
es aus der Arbeitsmappe entfernt, falls es bereits existiert.
b) Schreiben Sie ein Programm, das die Position des Tabellenblatts "Zwischenresultate"
nach links bzw.
nach rechts verschiebt.
In Aufgabe a) muss zuerst getestet werden, ob das Tabellenblatt Zwischenresultate bereits existiert oder nicht. Man durchläuft dazu alle Elemente der Worksheets-Auflistung und vergleicht deren Namen mit dem vorgegebenen. Als Schleife eignet sich die For ... Next-Schleife. Sie bricht ab, wenn die Zählvariable den Wert der Eigenschaft Count erreicht.
Dim i As Integer 'Laufvariable
Dim BlattGefunden As Boolean 'mit False initialisiert
For i = 1 To Worksheets.Count
If Worksheets.Item(i).Name = "Zwischenresultate" Then
BlattGefunden = True
End If
Next i
Worksheets.Item(i) gibt das i-te Objekt der Auflistung zurück. Möglich ist auch der Zugriff über den Objektnamen, zum Beispiel Worksheets.Item("XY"). Die uns bereits begegneten Anweisungen Worksheets(i) bzw. Worksheets("XY") sind Kurzformen für den Aufruf der Item-Methode.
Für das Durchlaufen von Auflistungen stellt Visual Basic einen speziellen
Schleifentyp zur Verfügung, die For Each ... Next-Schleife (vgl.
Objektterminologie und
VBA). Die Laufvariable enthält bei diesem Schleifentyp direkt das Objekt und nicht eine
Nummer oder einen Namen. Mit der For Each ... Next-Schleife kann der obere Programmteil wie folgt
geschrieben werden. Laufvariable ist die Variable Tabellenblatt vom Datentyp
Worksheet.
Dim Tabellenblatt As Worksheet 'Laufvariable
Dim BlattGefunden As Boolean 'mit False initialisiert
For Each Tabellenblatt In Worksheets 'DURCHLAUFE ALLE Objekte IN der Auflistung
If Tabellenblatt.Name = "Zwischenresultate" Then
BlattGefunden = True
End If
Next Tabellenblatt
Das Resultat der beiden Programmvarianten ist dasselbe. Die Variable BlattGefunden enthält True, falls das Tabellenblatt Zwischenresultate existiert und sonst False. Bei False soll nun gemäss Aufgabe a) das Blatt erstellt und hinzugefügt und bei True aus der Auflistung entfernt werden.
If BlattGefunden = False Then
Worksheets.Add.Name = "Zwischenresultate"
Else
Worksheets.Item("Zwischenresultate").Delete
End If
Die Anweisung Worksheets.Add erstellt ein neues Objekt und gibt es zurück. Noch in derselben Zeile wird anschliessend die Name-Eigenschaft des neuen Objekts auf Zwischenresultate gesetzt. Die Lösch-Anweisung verläuft ähnlich. Worksheets.Item("Zwischenresultate") gibt das Objekt zurück, das gelöscht werden soll, und die Delete-Methode führt die Löschoperation aus. Beachten Sie, dass nicht die Lösch-Methode der Auflistung (Worksheets.Delete) zur Anwendung kommt, da diese die Auflistung selbst löschen würde.
Um ein Tabellenblatt in einer Tabellenblatt-Auflistung neu zu positionieren (Aufgabe b), bieten die Worksheet-Objekte die Move-Methode an. Als Argument nimmt die Methode das Objekt entgegen, hinter bzw. vor dem das Objekt liegen soll. Die Anweisungen
Worksheets("XY").Move After:=Worksheets(3) bzw.
Worksheets("XY").Move Before:=Worksheets(3)
positionieren zum Beispiel das Tabellenblatt XY neu hinter bzw. vor dem Blatt, das zur Zeit an dritter Position ist. After und Before sind benannte Argumente. Da es keine Lücken in den Indizes geben darf, müssen gewisse Tabellenblätter bei einer solchen Operation zwangsweise neu nummeriert werden.
Um ein Objekt in einer Auflistung mit der Move-Methode um eine Position zu verschieben, muss seine aktuelle Position bekannt sein. Die Objekte einer Auflistung merken sich ihre Positionen in ihren Index-Eigenschaften. Die Anweisung
MeinePosition = Worksheets("XY").Index
schreibt zum Beispiel die Position (etwa 3) des Tabellenblatts XY in die Variable MeinePosition. Existiert das Objekt XY nicht, so wird ein Laufzeitfehler ausgegeben!
In Aufgabe b) muss der Verschiebe-Algorithmus wieder die Elemente der Auflistung durchlaufen, um sicherzustellen, dass das Arbeitsblatt "Zwischenresultate" existiert. Existiert das Objekt und befindet es sich nicht bereits ganz rechts bzw. ganz links, so lässt sich seine neue Position leicht aus seiner alten berechnen. Das Programm zum Verschieben nach rechts sieht damit folgendermassen aus.
Dim Blatt As Worksheet 'Laufvariable
For Each Blatt In Worksheets
If Blatt.Name = "Zwischenresultate" Then
If Blatt.Index < Worksheets.Count Then
Blatt.Move After:=Worksheets(Blatt.Index + 1)
Exit For
End If
End If
Next Tabellenblatt
Move-Methode
For Each ... Next-Schleife
Übungsaufgabe "kleine Helfer"